Закрыть и забытьvar ie = (document.all) ? true : false;
var postRequestFunction = null, requestResponse = null;
var req = false;
var isScriptStatusActive = false;
var requestTitle = null;
var requestStatusDivName = "requestStatusDiv", requestStatusTitleDivName = "requestStatusTitleDiv", requestStatusTextDivName = "requestStatusTextDiv";
var requestStatusDivHeight = 100, requestStatusDivWeight = 250;
var currentUrl = null, currentRequestParams = null, currentRequestType = null;
var ajaxMaxTriesCount = 3, ajaxCurrentTriesCount = 0;
/*
note that this function executes your chosen function after process the request results and
always puts result text into "requestResponse" variable
if traversing the response was failed, it gives message and anyway executes this function, but
remember that in this case you will have nillable content of requestResponse
NB! don't include this js into header!
*/
function loadXMLDoc(url, requestParams, func, reqTitle, requestType) {
currentUrl = url;
currentRequestType = requestType;
requestTitle = reqTitle;
showScriptStatus("Инициализация запроса");
if ( !requestType )
requestType = "POST";
postRequestFunction = func;
requestResponse = null;
if ( window.XMLHttpRequest ) { // branch for native XMLHttpRequest object
req = new XMLHttpRequest();
if ( req.overrideMimeType )
req.overrideMimeType("text/html");
}
else if ( window.ActiveXObject ) { // branch for IE/Windows ActiveX version
try{
req = new ActiveXObject("Microsoft.XMLHTTP");
}
catch(e){
try {
req = new ActiveXObject("Msxml2.XMLHTTP");
}
catch(e){}
}
}
if ( req )
req.onreadystatechange = processReqChange;
else {
alert("Не получается послать запрос...");
return false;
}
if ( requestType == "GET" ){
url = prepareUrl(url, requestParams);
req.open("GET", url, true);
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
req.setRequestHeader("X-Referer", document.location);
req.send(null);
}
else if ( requestType == "POST" ){
var parameters = prepareUrl("", requestParams);
req.open("POST", url, true);
req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
req.setRequestHeader("X-Referer", document.location);
req.setRequestHeader("Content-length", parameters.length);
req.setRequestHeader("Connection", "close");
req.send(parameters);
}
else
alert("Неизвестный тип запроса...");
}
function prepareUrl(url, requestParams){
var newUrl = url;
if ( !requestParams )
return newUrl;
if ( newUrl && newUrl.indexOf("?") == -1 )
newUrl += "?";
for ( var i in requestParams ){
var param = requestParams[i];
newUrl += "&"+i+"="+prepareLinkStr(trim(param));
}
return newUrl;
}
function processReqChange() {
showScriptStatus("Прием результата");
if ( req.readyState == 4 )
processRes(req);
else if ( req.readyState == 3 )
showScriptStatus("Результат запрос подготавливается к обработке");
else if ( req.readyState == 2 )
showScriptStatus("Результат запроса загружен");
else if ( req.readyState == 1 )
showScriptStatus("Загрузка результата запроса");
else
showScriptStatus("Ожидание иницилизации результата");
}
function processRes(req){
showScriptStatus("Результат запроса обрабатывается");
if ( req.status == 200 ){
hideScriptStatus();
ajaxCurrentTriesCount = 0;
requestResponse = req.responseText;
}
else
processBadResponse(req);
}
function recallLoadXMLDoc(){
loadXMLDoc(currentUrl, currentRequestParams, postRequestFunction, requestTitle, currentRequestType);
}
function processBadResponse(req){
//a small hack here, because sometimes IE thinks that server cancel request or whatever WinInet special error.
//fact is that on page load when ajax is running, sometimes it can't process data in a synchronous way for the main engine and ajax ActiveX component.
//so we recall it after 500ms and if it fails ajaxMaxTriesCount times in a row - give up
if ( req.status >= 12001 && req.status <= 12156 && ajaxCurrentTriesCount < ajaxMaxTriesCount ){
setTimeout("recallLoadXMLDoc()", 500);
ajaxCurrentTriesCount++;
return;
}
requestResponse = null;
ajaxCurrentTriesCount = 0;
var str = "Произошла следующая ошибка:<br>";
str += "<b>status:</b> "+req.status+"<br>";
str += "<b>statusText:</b> "+req.statusText+"<br>";
str += "<b>responseText:</b> "+req.responseText+"<br>";
str += "<b>responseXML:</b> "+req.responseXML+"<br>";
str += "<input type='button' style='border: 1pt solid black; font-family: Arial;' onClick=\"jаvаscript:hideScriptStatus();\" value='закрыть'>";
showScriptStatus(str);
}
function showScriptStatus(txt){
var statusDiv = document.getElementById(requestStatusDivName);
if ( !isScriptStatusActive ){
getCurrentWindowSize();
hideElementsIfNeeded(requestStatusDivName);
}
document.getElementById(requestStatusTitleDivName).innerHTML = requestTitle ? requestTitle : "";
document.getElementById(requestStatusTextDivName).innerHTML = txt;
statusDiv.style.top = (winH-requestStatusDivHeight)/2+document.body.scrollTop;
statusDiv.style.left = (winW-requestStatusDivWeight)/2;
statusDiv.style.visibility = "visible";
isScriptStatusActive = true;
}
function hideScriptStatus(){
var statusDiv = document.getElementById(requestStatusDivName);
statusDiv.style.visibility = "hidden";
unhideElements();
setTimeout(postRequestFunction, 0);
isScriptStatusActive = false;
}
function prepareHighlightDivs(){
var str = "<div id="+requestStatusDivName+" class=popup style='visibility:hidden'><div class=popupWindow>";
str += "<p align=\"center\"><img src=\"../design/img/ornament1.png\" alt=\"\" width=\"130\" height=\"20\"></p>";
str += "<div style='width:100%; overflow:auto;' id='"+requestStatusTitleDivName+"'></div>";
str += "<div style='width:100%; overflow:auto;' id='"+requestStatusTextDivName+"'></div>";
str += "<img src=\"../design/img/anim1.gif\" alt=\"\" width=\"28\" height=\"8\">";
str += "<p align=\"center\"><img src=\"../design/img/ornament1.png\" alt=\"\" width=\"130\" height=\"20\"></p>";
str += "</div></div>";
document.write(str);
}
prepareHighlightDivs();